home *** CD-ROM | disk | FTP | other *** search
/ Sprite 1984 - 1993 / Sprite 1984 - 1993.iso / src / lib / c / sync / sun3.md / Sync_Unlock.s < prev   
Text File  |  1990-02-12  |  3KB  |  86 lines

  1. |*
  2. |* syncAsm.s --
  3. |*
  4. |*    Source code for the Sync_Unlock library procedure.
  5. |*
  6. |* Copyright 1988 Regents of the University of California
  7. |* Permission to use, copy, modify, and distribute this
  8. |* software and its documentation for any purpose and without
  9. |* fee is hereby granted, provided that the above copyright
  10. |* notice appear in all copies.  The University of California
  11. |* makes no representations about the suitability of this
  12. |* software for any purpose.  It is provided "as is" without
  13. |* express or implied warranty.
  14. |*
  15.  
  16.     .data
  17.     .asciz "$Header: /sprite/src/lib/c/sync/sun3.md/RCS/Sync_Unlock.s,v 1.2 90/02/12 02:53:02 rab Exp $ SPRITE (Berkeley)"
  18.     .even
  19.     .text
  20.  
  21.  
  22. /*
  23.  *----------------------------------------------------------------------------
  24.  *
  25.  * Sync_Unlock --
  26.  *
  27.  *      Release a lock.  This is called at the end of a critical
  28.  *      section of code to allow other processes to execute within the
  29.  *      critical section.  If any processes are waiting to acquire this
  30.  *      lock they are made runnable.  They will try to gain the lock
  31.  *      again the next time they run.
  32.  *
  33.  * Results:
  34.  *    None.
  35.  *
  36.  * Side effects:
  37.  *    The lock is cleared.  Processes waiting on the lock are made runnable.
  38.  *
  39.  * C equivalent:
  40.  *
  41.  *    void
  42.  *    Sync_Unlock(lockPtr)
  43.  *        Sync_Lock *lockPtr;
  44.  *    {
  45.  *        lockPtr->inUse = 0;
  46.  *        if (lockPtr->waiting) {
  47.  *        Sync_SlowBroadcast((int)lockPtr, &lockPtr->waiting);
  48.  *        }
  49.  *    }
  50.  *
  51.  *----------------------------------------------------------------------------
  52.  */
  53.  
  54.     .text
  55.     .globl _Sync_Unlock
  56. _Sync_Unlock:
  57.  
  58.     movl    sp@(4), a0    | a0 = lockPtr
  59.     clrl    a0@        | lockPtr->inUse = 0;
  60.  
  61.     /*
  62.      * The check on the waiting bit races with the assignment
  63.      * statement that clears it in Sync_SlowBroadcast. In the
  64.      * worst case we assume someone is waiting that is really
  65.      * just waking up because we've cleared the inUse bit.
  66.      * That results in a wasted call to Sync_SlowBroadcast.
  67.      */
  68.  
  69.     tstl    a0@(4)        | if (lockPtr->waiting) {
  70.     jeq        1f        | Bail out if !lockPtr->waiting
  71.  
  72.     /*
  73.      * Note the broadcast semantics for Sync_SlowBroadcast.
  74.      * All processes waiting on the lock will be made runnable,
  75.      * however, all but one will sleep again inside Sync_SlowLock.
  76.      */
  77.  
  78.     movl    a0, d0
  79.     addql    #4, d0        | Get address of lockPtr->waiting.
  80.     movl    d0, sp@-    | Push &lockPtr->waiting on the stack.
  81.     movl    a0, sp@-    | Push lockPtr on the stack.
  82.     jbsr    _Sync_SlowBroadcast
  83.     addql    #8, sp        | Pop the stack.
  84.  
  85. 1:  rts
  86.